既然可以將音檔轉為文字回傳了,接下來我們可以嘗試看看將收到的 Text message 轉為音檔去進行 Audio message 的回傳,而這樣的功能會使用到的套件如下。
pip install
gtts 是 Google 的文字轉語音 API,它在轉換文字到語音的時候會需要兩個參數,分別是文字內容以及它是什麼語言。因此我們會需要用到第二個套件 langdetect 來協助我們便是該段文字是用什麼語言書寫的,而它的輸出會是 ISO 639- 1語言代碼。
而 line 再傳送音檔的時候,會需要輸入的參數除了音檔的 URL 以外,還會要求輸入該音檔的長度,這個長度會影響到使用者在接受到該訊息時所顯示的長度,雖然這部分的數值不影響音檔的運作,不過為了讓使用者可以準確的知道該音檔的長度,我們可以利用 AudioSegment 去取得該檔案的長度。範例程式碼如下。
from gtts import gTTS
from langdetect import detect
from pydub import AudioSegment
import math
# 轉成 aac 檔
def trans_mp3_to_aac(filepath, filename):
song = AudioSegment.from_file(filepath, "mp3")
song.export("./static/" + filename + ".aac", format="mp4")
# 回傳音檔的長度(ms)
return math.ceil(song.duration_seconds)
# 確認所傳文字的語言
language = detect(instruction)
# 轉檔並取得長度
path = "./audio/mp3/" + UserId +".mp3"
output = gTTS(text=instruction, lang="zh-TW", slow=False)
output.save(path)
# 為了避免重複存檔,用亂數來編號
num = random.randint(1,99999)
# 因為 line 傳送音檔需要 aac 格式,因此轉檔
lon = read_audio.trans_mp3_to_aac(path, UserId + str(num))
# line 長度顯示以秒為單位
line_bot_api.reply_message(event.reply_token, AudioSendMessage(original_content_url = ngrok_url + "/static/" + UserId + str(num) + ".aac",duration=(lon*1000)))